package com.ljb.haikanglibrary.utils;

import android.text.TextUtils;
import android.util.Log;

import com.ljb.logger.Logger;


/**
 * 日志工具类的封装
 *
 * @author lijianbin
 */
public class L {

    private L() {
    }

    /**
     * 如果想屏蔽所有log,将值设置为0
     */
    public static final int LOG_LEVEL = 6;

    public static final int VERBOSE = 5;
    public static final int DEBUG = 4;
    public static final int INFO = 3;
    public static final int WARN = 2;
    public static final int ERROR = 1;

    public static void v(String tag, String msg) {
        if (LOG_LEVEL > VERBOSE) {
            if (TextUtils.isEmpty(msg))
                throw new IllegalArgumentException("需要输出的日志信息不能为空");
            Log.v(tag, msg);
        }
    }

    public static void d(String tag, String msg) {
        if (LOG_LEVEL > DEBUG) {
            if (TextUtils.isEmpty(msg))
                throw new IllegalArgumentException("需要输出的日志信息不能为空");
            Log.d(tag, msg);
        }
    }

    public static void i(String tag, String msg) {
        if (LOG_LEVEL > INFO) {
            if (TextUtils.isEmpty(msg))
                throw new IllegalArgumentException("需要输出的日志信息不能为空");
            Log.i(tag, msg);
        }

    }

    public static void w(String tag, String msg) {
        if (LOG_LEVEL > WARN) {
            if (TextUtils.isEmpty(msg))
                throw new IllegalArgumentException("需要输出的日志信息不能为空");
            Log.i(tag, msg);
        }
    }

    public static void e(String tag, String msg) {
        if (LOG_LEVEL > ERROR) {
            if (TextUtils.isEmpty(msg))
                throw new IllegalArgumentException("需要输出的日志信息不能为空");
            Log.e(tag, msg);
        }
    }

    public static void v(String msg) {
        if (LOG_LEVEL > VERBOSE) {
            if (TextUtils.isEmpty(msg))
                throw new IllegalArgumentException("需要输出的日志信息不能为空");
            Log.v(getCazzName() + "-->" + getMethodName(), msg);
        }
    }

    public static void d(String msg) {
        if (LOG_LEVEL > DEBUG) {
            Log.d(getCazzName() + "-->" + getMethodName(), msg);
        }
    }

    public static void i(String msg) {
        if (LOG_LEVEL > INFO) {
            if (TextUtils.isEmpty(msg))
                throw new IllegalArgumentException("需要输出的日志信息不能为空");
            Log.i(getCazzName() + "-->" + getMethodName(), msg);
        }
    }

    public static void w(String msg) {
        if (LOG_LEVEL > WARN) {
            if (TextUtils.isEmpty(msg))
                throw new IllegalArgumentException("需要输出的日志信息不能为空");
            Log.w(getCazzName() + "-->" + getMethodName(), msg);
        }
    }

    public static void e(String msg) {
        if (LOG_LEVEL > ERROR) {
            if (TextUtils.isEmpty(msg))
                throw new IllegalArgumentException("需要输出的日志信息不能为空");
            Log.e(getCazzName() + "-->" + getMethodName(), msg);
        }
    }

    public static void json(String json) {
        if (LOG_LEVEL > ERROR) {
            if (TextUtils.isEmpty(json))
                throw new IllegalArgumentException("需要输出的日志信息不能为空");
            Logger.json(json);
        }

    }

    public static void json(Object o) {
        if (LOG_LEVEL > ERROR) {
            if (o == null)
                throw new IllegalArgumentException("需要输出的日志对象不能为空");
            Logger.json(JsonKit.toJson(o));
        }
    }

    /**
     * 获取调用者的类名
     *
     * @return
     */
    private static String getCazzName() {
        StackTraceElement caller = Thread.currentThread().getStackTrace()[5];
        String className = caller.getClassName();// 带有包名信息
        className = className.substring(className.lastIndexOf('.') + 1);
        return className;
    }

    public static String getCallerName() {
        StackTraceElement caller = Thread.currentThread().getStackTrace()[4];
        String className = caller.getClassName();// 带有包名信息
        className = className.substring(className.lastIndexOf('.') + 1);
        return className;
    }

    public static String getMethodName() {
        String methodName = new Exception().getStackTrace()[2].getMethodName();
        return methodName;
    }

}
